﻿package com.manyiaby.view.viewutils;

import android.content.Context;
import android.view.View;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;

import com.manyiaby.view.activityview.DetailArticleActivity;
import com.manyiaby.view.viewutils.activityUtil.ActivityUtil;
import com.manyiaby.welcome.ProxyApplication;

import java.io.File;
import java.util.ArrayList;

/**
 * Created by yx on 2018/6/25.
 */
public class WebViewUtils {
    private static final String TAG = "WebViewUtils";
    private static WebViewUtils instance;

    private int isCache = 1;//1开启缓存，0关闭缓存(在Activity将要调用Web页面前设置--Yx)

    public static WebViewUtils getInstance() {
        if (instance == null) {
            synchronized (WebViewUtils.class) {
                if (instance == null) {
                    instance = new WebViewUtils();
                }
            }
        }
        return instance;
    }

    /**
     * 用来控制字体大小
     */
//    private static int fontSize = 1;
    public WebViewUtils() {
    }

    public int getIsCache() {
        return isCache;
    }

    public void setIsCache(int isCache) {
        this.isCache = isCache;
    }

/**
     * 应用内加载H5网页内容,Url方式加载
     *
     * @param mContext
     * @param webView
     * @param url
     */
    public void loadUrl(Context mContext, WebView webView, String url, ProgressBar mProgressBar) {
        LogUtil.iYx("--------缓存：--------" + isCache);
        inItWebSettings(mContext, webView);

        webView.setWebViewClient(new MyWebViewClient(setWebSettings(mContext, webView)));
        webView.setWebChromeClient(new MyWebViewChromeClient(mContext, mProgressBar));

        webView.loadUrl(url);
    }

    /**
     * 应用内加载H5网页内容,网页文本方式加载
     *
     * @param mContext
     * @param webView
     * @param htmlTxt
     */
    public void loadHtmlTxt(Context mContext, WebView webView, String htmlTxt, ProgressBar mProgressBar) {
        inItWebSettings(mContext, webView);

        webView.addJavascriptInterface(new InJavaScriptLocalObj(mContext), "local_obj");
        webView.setWebViewClient(new MyWebViewClient(setWebSettings(mContext, webView)));
        webView.setWebChromeClient(new MyWebViewChromeClient(mContext, mProgressBar));

        webView.loadDataWithBaseURL(null, htmlTxt, "text/html", "utf-8", null);
    }




    /**
     * 获取WebView的设置WebSettings
     *
     * @param mContext
     * @param webView
     * @return
     */
    public WebSettings inItWebSettings(Context mContext, WebView webView) {

        WebSettings webSettings = webView.getSettings();

        webSettings.setUseWideViewPort(true);
        webSettings.setLoadWithOverviewMode(true);
        //设置网页布局类型： 1、LayoutAlgorithm.NARROW_COLUMNS ：适应内容大小 2、LayoutAlgorithm.SINGLE_COLUMN:适应屏幕，内容将自动缩放
        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);//注释掉webSettings.setUseWideViewPort(true)；webSettings.setLoadWithOverviewMode(true);
        // 添加该行防止Android4.4.4系统WebView加载数据下拉出现文字半屏问题

        webSettings.setJavaScriptEnabled(true);
        webSettings.setAllowFileAccess(true);
        // 开启支持视频
        webSettings.setPluginState(WebSettings.PluginState.ON);
        webSettings.setGeolocationEnabled(true);
        // 开启DOM缓存。
        if (isCache == 1) {
            //LOAD_DEFAULT 默认加载方式，使用这种方式，会实现快速前进后退，在同一个标签打开几个网页后，关闭网络时，可以通过前进后退来切换已经访问过的数据
            //LOAD_NO_CACHE / LOAD_NORMAL 这个方式跟LOAD_NO_CACHE方式相同，不使用缓存;
            //LOAD_CACHE_ELSE_NETWORK这个方式不论如何都会从缓存中加载，除非缓存中的网页过期;
            //LOAD_CACHE_ONLY 这个方式只是会使用缓存中的数据，不会使用网络
            webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
            webSettings.setDomStorageEnabled(true);//Dom Storage（Web Storage）存储机制：-Yx配合前端使用，使用时需要打开 DomStorage 开关。
            webSettings.setDatabaseEnabled(true);//Web SQL Database 存储机制：-Yx虽然已经不推荐使用了，但是为了兼容性，还是提供下
            webSettings.setDatabasePath(mContext.getApplicationContext().getCacheDir().getAbsolutePath());
            webSettings.setAppCacheEnabled(true);//Application Cache 存储机制-Yx 为支持 Web App 离线使用而开发的缓存机制
            webSettings.setAppCachePath(mContext.getApplicationContext().getCacheDir().getAbsolutePath());
            webSettings.setAppCacheMaxSize(Integer.MAX_VALUE);
            //Indexed Database 存储机制 IndexedDB 也是一种数据库的存储机制，但不同于已经不再支持的 Web SQL Database
            //File System API File System API 是 H5 新加入的存储机制。它为 Web App 提供了一个虚拟的文件系统，就像 Native App 访问本地文件系统一样
            //上面介绍的缓存技术，能优化二次启动 WebView 的加载速度
        }
        webSettings.setLoadsImagesAutomatically(true);  //支持自动加载图片
//        webSettings.setTextSize(WebSettings.TextSize.LARGER);
//        webSettings.setDefaultFontSize(32);//设置WebView默认字体大小
        return webSettings;
    }

    /**
     * 清除WebView缓存
     */
    public void clearWebViewCache() {
        //清理Webview缓存数据库
        try {
            ProxyApplication.getInstance().deleteDatabase("webview.db");
            ProxyApplication.getInstance().deleteDatabase("webviewCache.db");
            ProxyApplication.getInstance().deleteDatabase("WebView.db");
            ProxyApplication.getInstance().deleteDatabase("WebViewCache.db");
            //WebView 缓存文件
            File appCacheDir = new File(ProxyApplication.getInstance().getFilesDir().getAbsolutePath() + "/webcache");

            File webviewCacheDir = new File(ProxyApplication.getInstance().getCacheDir().getAbsolutePath() + "/webviewCache");

            //删除webview 缓存目录
            if (webviewCacheDir.exists()) {
                deleteFile(webviewCacheDir);
            }
            //删除webview 缓存 缓存目录
            if (appCacheDir.exists()) {
                deleteFile(appCacheDir);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 递归删除 文件/文件夹
     *
     * @param file
     */
    public void deleteFile(File file) {
        if (file.exists()) {
            if (file.isFile()) {
                file.delete();
            } else if (file.isDirectory()) {
                File files[] = file.listFiles();
                for (int i = 0; i < files.length; i++) {
                    deleteFile(files[i]);
                }
            }
            file.delete();
        } else {
            LogUtil.iYx("delete file no exists " + file.getAbsolutePath());
        }
    }



    /**
     * WebView与原生APP交互
     */
    class InJavaScriptLocalObj {
        private Context mContext;

        public InJavaScriptLocalObj() {
        }

        public InJavaScriptLocalObj(Context mContext) {
            this.mContext = mContext;
        }

        @JavascriptInterface//添加防止addJavascriptInterface报错
        public void showSource(String imageUrl) {
            if (ProxyApplication.isFastClick()) {
                return;
            }
            LogUtil.i(TAG, "====>html_imgUrl=" + imageUrl);
            ArrayList<String> imgList = new ArrayList<String>();
            imgList.add(imageUrl);
            ActivityUtil.selectImage(mContext, imgList, 0);
        }
    }
}
